/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import java.util.Iterator;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import pojos.Bill;
import pojos.Customer;
import pojos.Exporter;

/**
 *
 * @author A7med Kotb
 */
public abstract class AbstractFacade<T> {
    private Class<T> entityClass;

    public AbstractFacade(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    protected abstract EntityManager getEntityManager();

    public void create(T entity) {
        getEntityManager().persist(entity);
    }

    public void edit(T entity) {
        getEntityManager().merge(entity);
    }

    public void remove(T entity) {
        getEntityManager().remove(getEntityManager().merge(entity));
    }

    public T find(Object id) {
        return getEntityManager().find(entityClass, id);
    }

    public List<T> findAll() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return getEntityManager().createQuery(cq).getResultList();
    }

    public List<T> findRange(int[] range) {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        javax.persistence.Query q = getEntityManager().createQuery(cq);
        q.setMaxResults(range[1] - range[0]);
        q.setFirstResult(range[0]);
        return q.getResultList();
    }

    public int count() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
        cq.select(getEntityManager().getCriteriaBuilder().count(rt));
        javax.persistence.Query q = getEntityManager().createQuery(cq);
        return ((Long) q.getSingleResult()).intValue();
    }
    public List getBillsExporter(int exporterId)
    {
         Query query = getEntityManager().createNamedQuery("Bill.findByExporterID");
      
      Exporter t=new Exporter(exporterId);
          query.setParameter("exporterID", t);
       
        List list = query.getResultList();
        System.out.println(" in list size in facad "+list.size());
        for (Iterator it = list.iterator(); it.hasNext();) {
            Bill  object =(Bill) it.next();
            System.out.println(" in facad : "+object.getBillTotal());
            
        }
        return list;
    }
        public List getBillsCustomer(int customerId)
    {
         Query query = getEntityManager().createNamedQuery("Bill.findByCustomerID");
      
      Customer t=new Customer(customerId);
          query.setParameter("customerID", t);
       
        List list = query.getResultList();
        return list;
    }
}
